#ifndef TEST_H_
#define TEST_H_

#include <unistd.h>
#include <pthread.h>

#include <Basic.hh>
#include "LinkedList.hh"

//
/**
 * \file Test.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class Test Test.hh
 *
 *
 */
class Test
{
public:
   /**
     * \name Test
     *
     * Constructor
     */
	Test();

// Module
protected:
   /**
     * \name createThread
     *
     * 스레드를 생성한다.
     *
     * \param Num 생성할 스레드의 개수.
     * \param StartRoutine 스레드의 시작 루틴.
     *
     * \return
     *
     * 성공할 경우 pthread_t의 리스트의 시작 주소,
     * 실패할 경우 NULL.
     */
	LinkedList<pthread_t>* createThread(USNumber Num, TRoutine StartRoutine);
	
	/**
     * \name createThread
     *
     * 스레드를 생성해 준다.
     *
     * \param Num 생성할 스레드의 개수.
     * \param StartRoutine 스레드의 시작 루틴.
	  * \param Param 루틴에 넘길 데이터.
     *
     * \return
     *
     * 성공할 경우 pthread_t의 리스트의 시작 주소,
     * 실패할 경우 NULL.
     */
	LinkedList<pthread_t>* createThread(USNumber Num, TRoutine StartRoutine, void*Param);

   /**
     * \name destoryThread
     *
     * 생성한 스레드와 동기화 한다.
     * 즉, 생성한 스레드 모두가 끝날 때까지 가다린다.
     *
     * \param Root
     *
     * \return
     *
     * 성공할 경우 RETURN_OK,
     * 실패할 경우 RETURN_OK가 아닌 값.
     */
	ResultOf destoryThread(LinkedList<pthread_t>* Root);

   /**
     * \name delay
     *
     * 지연한다.
     *
     * \param MicroSec 지연 시간.
     */
	static void delay(USNumber MicroSec);

// ???
private:
   /**
     * \name genUniform
     *
     * 유니폼 분포.
     *
     * \return
     *
     * 0 ~ 1 사이의 값.
     */
	static double genUniform();

   /**
     * \name genNormal
     *
     * 정규 분포.
     * 일반 정규분포가 아님.
     *
     * \return
     *
     * Average - 4 * StandDeviation ~ Average + 4 * StandDeviation
     */
	static double genNormal(double Average, double StandDeviation);

   /**
     * \name genExp
     *
     * 지수 분포.
     *
     * \return
     *
     * 0 ~ 1
     */
	static double genExp(double Lamda);
};

#endif //TEST_H_
